package thread;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: wx
 * Date: 2024-01-04
 * Time: 20:27
 */
/**
 * 多线程代码案例
 * 单例模式
 * 单例模式是一种设计模式
 * 单例 == 单个实例(对象)
 * 某个类,在一个进程中,只能创建出一个进程
 * 使用单例模式,就可以对代码进行一个更严格的校验和检查
 *
 * 举个栗子,有的时候代码中,需要使用一个对象,来管理/持有大量大数据
 * 此时有一个对象就可以了,比如,一个对象管理 10G 的数据,
 * 如果不小心创建出来了多个对象,内存空间就会陈蓓增长,机器就顶不住了
 *
 * 唯一的对象如何进行保证呢?
 * 淡然可以通过"君子约定"的方式,下一个文档,文档上约定,每个接收维护代码的程序猿,都不能把这个类创建多个实例
 *                       (很明显,这种约定不靠谱的)
 *                       所以我们希望机器(让编译器)能够对代码中指定的类,创建的实例个数进行校验
 *                       如果发现创建了多个实例,就直接编译报错.
 *                       如果能够做到这一点,就可以非常放心的创建代码,不必担心因为失误创建出多个实例了
 *   java语法,本身没有办法直接约定某个对象创建几个实例
 *   就需要通过一些"奇淫巧技"来变相实现这样的效果
 *
 *   实现单例模式的方式 有很多种
 *   在这里介绍两种简单的单例模式("饿汉模式","懒汉模式")
 */

//这个类只能有唯一的实例
class Singleton{
    //这个引用就是我们期望创建出的唯一的实例引用
    private static Singleton instance = new Singleton();
          //static 静态的 指的是"类属性"
                           //instance 就是 Singleton 类对象 里面持有的属性
      // 每个类的类对象,只存在一个,类对象中的 static 属性,自然也是只有一个了
    public static Singleton getInstance() {  //其他代码要想使用这个类的实例,就需要通过这个方法来获取 不应该在其他代码中重新 new 对象,而是使用这个方法获取到现成的对象
        return instance;
    }

    private Singleton() {} //设成私有的 其他代码没办法 new
}
public class ThreadDemo25 {
    public static void main(String[] args) {
        //Singleton singleton = new Singleton();
        Singleton s = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s = s2);
    }
}
//上述代码,我们就称为"饿汉模式",单例模式中的一种简单的写法
//所谓 "饿" 形容 "非常迫切"                                                       //使用反射可以打破上述的约定
// 实例是在加载的时候就创建了,创建时机非常早,相当于程序一启动,实例就创建好了                 //反射属于非常规手段
// 使用"饿汉"形容创建实例非常迫切,"非常早",                                          //